型態 | 大小 | 數值範圍 |
---|---|---|
Byte | 8-bit | -2^7 ~ 2^7 - 1 |
Short | 16-bit | -2^15 ~ 2^15 - 1 |
Int | 32-bit | -2^31 ~ 2^31 - 1 |
Long | 64-bit | -2^63 ~ 2^63 -1 |
Char | 16-bit | 0 ~ 2^16 - 1 |
Float | 32-bit | |
Double | 64-bit | |
Boolean | true or false | |
String | a sequence of Chars |
Literals 想翻成中文還真模糊,看了一堆資料感覺還是不知道該怎麼解釋比較好,但可以透過一些例子來了解一下它的觀念.目前了解 literals 的概念大概是指的是指說可以直接寫一個常數值在程式碼裡,編譯器會根據程式寫的常數對應到該對應的型態.
轉成 Long 或 Double,Long 在後面加上 L 或 l ,Double 在後面加上 D 或 d.0x 開頭是16進位.
scala> val hexNum = 0x1aFL
hexNum: Long = 431
scala> val hexNum = 168d
hexNum: Double = 168.0
Byte 及 Short 在宣告變數時加上型態,compiler 時會檢查 value 是否超過大小 :
像 Byte 的範圍是 -2^7 ~ 2^7 - 1
scala> val num : Byte = 127
num: Byte = 127
scala> val num : Byte = -128
num: Byte = -128
scala> val num : Short = 127
num: Short = 127
16進位(hexadecimal),開頭要寫 0x 或 0X,內容為數字1~9、大小寫字母a~f.
順便複習一下16進位轉10進位的算法 :
1AF(16進位)
-> 1 * 16^2 + 10 * 16^1 + 15 * 16^0
-> 1 * 16 * 16 + 10 * 16 + 15 * 1 = 256 + 160 + 15 = 431(10進位)
scala> val hexNum = 0x1aF
hexNum: Int = 431
這裡使用的 scala 版本是 2.12.4,所以已經將 8 進位(octal)的 literals 移掉了.
Remove octal number literals : SI-7618
scala> val num = 035
<console>:1: error: Decimal integer literals may not have a leading zero. (Octal syntax is obsolete.)
val num = 035
^
要轉8進位時,scala 有提供一個 BigInt 的物件,可以轉任何進位 :
scala> val num1 = BigInt("35" , 10)
num1: scala.math.BigInt = 35
scala> val num1 = BigInt("35" , 8)
num1: scala.math.BigInt = 29
scala> val num1 = BigInt("35" , 16)
num1: scala.math.BigInt = 53
用單引號包起來的 Unicode 字元 :
scala> val c = 'A'
c: Char = A
scala> val c = '\u0041'
c: Char = A
scala> val c = '\\'
c: Char = \
跳脫字元 | 意思 |
---|---|
\n | 換行 (\u000A) |
\b | 倒退一個字元 (\u0008) |
\t | tab (\u0009) |
\f | 換頁 (\u000C) |
\r | 游標移至行首 (\u000D) |
\" | double quote (\u0022) |
\' | single quote (\u0027) |
\\ | backslash (\u005C) |
要用 unicode 來表示會有一些規則要注意,真的要用到時再查一下,這邊先列幾個例子 :
scala> val c = '\u000A'
c: Char =
scala> val s = c + "Hi"
s: String =
"
Hi"
scala> val c = '\u0022'
c: Char = "
scala> val c = '\u005C\u0027'
c: Char = '
scala> val c = '\u005C\u005C'
c: Char = \
用雙引號包多個字元組成的字串 :
scala> val msg = "Hello \"Daniel\""
msg: String = Hello "Daniel"
Scala 還提供了一個很方便的功能叫 raw strings,是使用三個雙引號包起來的字串,
裡面的字串都會被當成純文字,不會被跳脫字元影響 :
scala> val msg = """Hello \"Daniel\""""
msg: String = Hello \"Daniel\"
就是 true 跟 false
scala> val check = true
check: Boolean = true
scala 還有一個比較特別的是 Symbol literals,可以用 .name 取出內容 :
scala> val s = 'Daniel
s: Symbol = 'Daniel
scala> s.name
res0: String = Daniel
scala> def sayHi(names: Symbol) = "Hi " + names.name
sayHi: (names: Symbol)String
scala> sayHi('Daniel)
res5: String = Hi Daniel
scala> sayHi('Sam)
res6: String = Hi Sam